package cn.edu.wynu.d3_final;
/*
final
final关键字是最终的意思，可以修饰(类、方法、变量)
修饰类:该类被称为最终类，特点是不能被继承了。
修饰方法:该方法被称为最终方法，特点是不能被重写了。
修饰变量:该变量只能被赋值一次。

final修饰变量的注意：
final修饰基本类型的变量，变量存储的数据不能被改变。
final修饰引用类型的变量，变量存储的地址不能被改变，但地址所指向对象的内容是可以被改变的。
*/

public class Test {
    /**
     * 常量：public static final修饰的成员变量，称为常量。建议名称全部大写，多个单词之间用下划线连接
     * public static final String SCHOOL_NAME = "dianyuan";
     */
    public static final String schoolName = "dianyuan"; // 静态成员变量，要求赋值

    // 这种用法没有意义，知道就行
    private final String name = "张三"; // 实例成员变量，要求赋值


    public static void main(String[] afatkunrgs) {
        // 认识final的作用
        // 3、final可以修饰变量，总规则：有且仅能赋值一次
        /*  变量：
            一、局部变量
            二、成员变量
                1、静态成员变量
                2、实例成员变量
        */

        // (1)final修饰局部变量
        final int a;
        a = 10;
        // a = 20; // 第二次赋值，报错，变量a已经被赋值了

        final double r = 3.14;
        // r = 3.14; // 第二次赋值，报错
        // 这里不希望改变r值

        final int[] arr = {1, 2, 3};
        // arr = null; // 地址不能被改变
        arr[0] = 100; // 内容可以改变

        // schoolName = "dianyuan1"; // 静态成员变量，第二次赋值就会报错

        Test t = new Test();
        // t.name = "李四"; // 实例成员变量，第二次赋值就会报错
    }

    public static void buy(final double z){
        // z = 0.2; // 第二次赋值，报错
    }
}

// 1、final修饰类，类不能被继承
final class A {}
// class B extends A {} // 报错

// 2、final修饰方法，方法不能被重写
class C {
    public final void test() {

    }
}

class D extends C {
//    @Override
//    public void test() {
//
//
//    }
}
